package com.jdd.modules.parkmonthly.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jdd.common.api.vo.Result;
import com.jdd.modules.configcartype.entity.ConfigCarType;
import com.jdd.modules.parkcar.entity.ParkCarMonthly;
import com.jdd.modules.parkcar.entity.ParkSpace;
import com.jdd.modules.parking.entity.ConfigParkInfo;
import com.jdd.modules.parking.entity.ParkCarEnterLog;
import com.jdd.modules.parkmonthly.dto.MonthlyCarDto;
import com.jdd.modules.parkmonthly.dto.MonthlyCardDelayDto;
import com.jdd.modules.parkmonthly.entity.MonthlyCarTypeConvert;
import com.jdd.modules.parkmonthly.entity.MonthlyCardInfo;
import com.jdd.modules.parkmonthly.entity.MonthlyPackageInfo;
import com.jdd.modules.parkmonthly.vo.AddMonthlyCardInfoVO;
import com.jdd.modules.sdkidentifyresultpushlog.entity.vo.MonthlyCardAndPackageVo;

import java.util.List;

/**
 * @Description: 月卡信息表
 * @Author: jdd
 * @Date: 2021-11-09
 * @Version: V1.0
 */
public interface IMonthlyCardInfoService extends IService<MonthlyCardInfo> {


    List<String> getIds(QueryWrapper<MonthlyCardInfo> queryWrapper);

    /**
     * 处理确认
     *
     * @param monthlyCarDto
     * @return
     */
    Result<String> delayConfirm(MonthlyCarDto monthlyCarDto);

    /**
     * 添加月卡
     *
     * @param monthlyCardInfo
     * @return
     */
    Result<MonthlyCardInfo> add(MonthlyCardInfo monthlyCardInfo);

    /**
     * 根据勾选权限，查询出所有权限下未绑定的车位信息
     *
     * @param monthlyCardInfo
     * @return
     */
    Result<List<ParkSpace>> queryUnUseSpace(MonthlyCardInfo monthlyCardInfo);

    /**
     * 编辑，查询该月卡信息绑定的车牌号信息
     *
     * @param monthlyCardInfo
     * @return
     */
    Result getUpatePlateNoInfo(MonthlyCardInfo monthlyCardInfo);

    /**
     * 编辑，查询该月卡信息绑定的车位信息
     *
     * @param monthlyCardInfo
     * @return
     */
    Result getUpateCarPlaceInfo(MonthlyCardInfo monthlyCardInfo);

    /**
     * 注销月卡信息
     *
     * @param monthlyCardInfo
     * @return
     */
    Result getMonthlyCardConcel(MonthlyCardInfo monthlyCardInfo);

    /**
     * 月卡延期
     *
     * @param monthlyCardDelayDto
     * @return
     */
    Result updateMonthlyCardDelay(MonthlyCardDelayDto monthlyCardDelayDto);

    /**
     * 编辑月卡信息  月租编号,月租套餐,通行权限,车位编号,起始截止时间,金额不能改  其他都可以改
     *
     * @param monthlyCardInfo
     * @return
     */
    Result<MonthlyCardInfo> editMonthlyCard(MonthlyCardInfo monthlyCardInfo);

    /**
     * 根据月卡ID查询月卡信息和月卡套餐信息
     *
     * @param cardId
     * @return
     */
    MonthlyCardAndPackageVo getCardInfoAndPackageInfo(String cardId);


    ConfigCarType getCarType(String parkCode, int type);

    /**
     * 封装转卡信息
     *
     * @param monthlyCardInfo
     * @param parkCarEnterLog
     * @param monthlyPackageInfo
     * @return
     */
    MonthlyCarTypeConvert getMonthlyCarTypeConvert(MonthlyCardInfo monthlyCardInfo, ParkCarEnterLog
            parkCarEnterLog, MonthlyPackageInfo monthlyPackageInfo);

    /**
     * 组装月卡信息表
     *
     * @param monthlyCardInfo
     * @param oneByParkCode
     * @return
     */
    boolean getMonthlyCardInfo(MonthlyCardInfo monthlyCardInfo, ConfigParkInfo oneByParkCode);

    /**
     * 封装日志信息记录日志信息
     *
     * @param monthlyCardInfo
     * @param optionsType
     * @return
     */
    boolean getMonthlyCardEditInfo(MonthlyCardInfo monthlyCardInfo, String optionsType);

    /**
     * 封装月租车实体信息
     *
     * @param parkSpaces
     * @param plateNoList
     * @param monthlyCardInfo
     * @return
     */
    List<ParkCarMonthly> getParkCarMonthlyEntity(List<ParkSpace> parkSpaces, List<String> plateNoList, MonthlyCardInfo monthlyCardInfo);

    /**
     * 处理编辑时，在场车辆转卡
     *
     * @param enterLogList
     * @param unUsePace
     * @param monthlyCardInfo
     * @param monthlyPackageInfo
     */
    void dealCarLog(List<ParkCarEnterLog> enterLogList, List<ParkSpace> unUsePace,
                    MonthlyCardInfo monthlyCardInfo, MonthlyPackageInfo monthlyPackageInfo);

    /**
     * 处理编辑时，在场车辆转卡
     *
     * @param enterLogList
     * @param unUsePace
     * @param monthlyCardInfo
     * @param monthlyPackageInfo
     * @param addMonthlyCardInfoVO
     */
    void dealCarLog(List<ParkCarEnterLog> enterLogList, List<ParkSpace> unUsePace,
                    MonthlyCardInfo monthlyCardInfo, MonthlyPackageInfo monthlyPackageInfo, AddMonthlyCardInfoVO addMonthlyCardInfoVO);

    /**
     * 最近的一条入场记录，是否在指定区域内
     *
     * @param parkCode
     * @param plateNos
     * @param areaList
     * @return
     */
    List<ParkCarEnterLog> getList(String parkCode, List<String> plateNos, List<String> areaList);

    /**
     * @Title: getMonthlyCode
     * @Description:月卡编号生成规则
     * 月卡编号生成规则
     *
     * @param parkCode
     * @return
     */
    String getMonthlyCode(String parkCode);


}
